package cl.hhha.web.webapp.action;

import com.opensymphony.xwork2.Preparable;

import cl.hhha.web.service.FormularioOirsManager;
import cl.hhha.web.service.GenericManager;
import cl.hhha.web.util.ValidaUtil;
import cl.hhha.web.model.Comuna;
import cl.hhha.web.model.EstadoFormulario;
import cl.hhha.web.model.Formulario;
import cl.hhha.web.model.OrientacionFormulario;
import cl.hhha.web.model.Sexo;
import cl.hhha.web.model.Solicitante;
import cl.hhha.web.model.TipoFormulario;
import cl.hhha.web.webapp.action.BaseAction;

import java.util.Date;
import java.util.List;

public class FormularioOirsAction extends BaseAction implements Preparable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1478648401649973224L;
	
	
	private FormularioOirsManager formularioOirsManager;
	private GenericManager<EstadoFormulario, Long> estadoFormularioManager; 
	private GenericManager<TipoFormulario, Long> tipoFormularioManager;
	private GenericManager<OrientacionFormulario, Long> orientacionFormularioManager;
	private GenericManager<Sexo, Long> sexoManager;	
	private GenericManager<Comuna, Long> comunaManager;
	

	private List<Formulario> formularioOirss;
	private List<EstadoFormulario> estadoFormularioOirss;
	private List<TipoFormulario> tipoSolicitudOirss;
	private List<OrientacionFormulario> orientaciones;
	private List<Sexo> sexos;
	private List<Comuna> comunas;
	private Formulario formularioOirs;
	private Long  id;

	public String opcion;


	/**
	 * @param comunaManager the comunaManager to set
	 */
	public void setComunaManager(GenericManager<Comuna, Long> comunaManager) {
		this.comunaManager = comunaManager;
	}

	public void setOrientacionFormularioManager(
			GenericManager<OrientacionFormulario, Long> orientacionFormularioManager) {
		this.orientacionFormularioManager = orientacionFormularioManager;
	}

	/**
	 * @param sexoManager the sexoManager to set
	 */
	public void setSexoManager(GenericManager<Sexo, Long> sexoManager) {
		this.sexoManager = sexoManager;
	}

	public void setFormularioOirsManager(FormularioOirsManager formularioOirsManager) {
		this.formularioOirsManager = formularioOirsManager;
	}

	/**
	 * @param estadoFormularioManager the estadoFormularioOirsManager to set
	 */
	public void setEstadoFormularioManager(
			GenericManager<EstadoFormulario, Long> estadoFormularioOirsManager) {
		this.estadoFormularioManager = estadoFormularioOirsManager;
	}

	/**
	 * @param tipoFormularioManager the tipoSolicitudOirsManager to set
	 */
	public void setTipoFormularioManager(
			GenericManager<TipoFormulario, Long> tipoSolicitudOirsManager) {
		this.tipoFormularioManager = tipoSolicitudOirsManager;
	}

	public List<Formulario> getFormularioOirss() {
		return formularioOirss;
	}

	/**
	 * @return the estadoFormularioOirss
	 */
	public List<EstadoFormulario> getEstadoFormularioOirss() {
		if(estadoFormularioOirss == null){
			estadoFormularioOirss = estadoFormularioManager.getAll();
		}
		return estadoFormularioOirss;
	}

	/**
	 * @return the tipoSolicitudOirss
	 */
	public List<TipoFormulario> getTipoSolicitudOirss() {
		if(tipoSolicitudOirss == null){
			tipoSolicitudOirss = tipoFormularioManager.getAll();
		}
		return tipoSolicitudOirss;
	}

	public List<OrientacionFormulario> getOrientaciones() {
		if(orientaciones == null){
			orientaciones = orientacionFormularioManager.getAll();
		}
		return orientaciones;
	}
	
	/**
	 * @return the sexos
	 */
	public List<Sexo> getSexos() {
		if(sexos == null){
			sexos = sexoManager.getAll();
		}
		return sexos;
	}

	/**
	 * @return the comunas
	 */
	public List<Comuna> getComunas() {
		if(comunas == null){
			comunas = comunaManager.getAll();
		}
		return comunas;
	}

	/**
	 * Grab the entity from the database before populating with request parameters
	 */
	public void prepare() {
		if (getRequest().getMethod().equalsIgnoreCase("post")) {
			// prevent failures on new
			String formularioOirsId = getRequest().getParameter("formularioOirs.id");
			if (formularioOirsId != null && !formularioOirsId.equals("")) {
				formularioOirs = formularioOirsManager.get(new Long(formularioOirsId));
			}
		}
	}

	public String list() {
		formularioOirss = formularioOirsManager.getAll();
		return SUCCESS;
	}

	public String listDirector() {
		formularioOirss = formularioOirsManager.getSolicitudesIngresadas();
		return SUCCESS;
	}

	public String estadoTomarConocimiento() {
		formularioOirs = formularioOirsManager.tomarConocimiento(formularioOirs);
		saveMessage("Se ha tomado conocimiento de la solicitud ciudadana con folio " + formularioOirs.getId());
		return SUCCESS;
	}

	public void setId(Long  id) {
		this. id =  id;
	}

	public Formulario getFormularioOirs() {
		return formularioOirs;
	}

	public void setFormularioOirs(Formulario formularioOirs) {
		this.formularioOirs = formularioOirs;
	}

	public String delete() {
		formularioOirsManager.remove(formularioOirs.getId());
		saveMessage(getText("formularioOirs.deleted"));

		return SUCCESS;
	}

	public String edit() {
		if (id != null) {
			formularioOirs = formularioOirsManager.get(id);
		} else {
			formularioOirs = new Formulario();
		}

		return SUCCESS;
	}

	public String save() throws Exception {
		if (cancel != null) {
			return "cancel";
		}

		if (delete != null) {
			return delete();
		}

		Boolean noHayErrores = true;
		Solicitante s = formularioOirs.getSolicitante();
//
//		if("1".equals(opcion)){//validamos el telefono
//
//			String telefono = s.getTelefono().getNumeroTelefonico();
//			noHayErrores &= esLargoMinimoValido(telefono, "formularioOirs.solicitante.telefono.numero", 6);
//
//		} else if ("2".equals(opcion)){//validamos direccion
//
//			noHayErrores &= esLargoMinimoValido(s.getDireccion().getCalle(), "formularioOirs.solicitante.direccion.calle", 6);
//			noHayErrores &= esLargoMinimoValido(s.getDireccion().getNumeroCalle(), "formularioOirs.solicitante.direccion.numeroCalle", 1);
//			noHayErrores &= esLargoMinimoValido(s.getDireccion().getComuna(), "formularioOirs.solicitante.direccion.comuna", 3);        	
//
//		} else if ("3".equals(opcion)) {//validamos correo.
//
//			noHayErrores &= super.esCorreoValido(s.getCorreo().getCorreoElectronico(), "formularioOirs.solicitante.correo.correoElectronico");
//
//		} else if("x".equals(opcion)){
//			
//			//hacer nada, se esta guardando en sap.
//			
//		} else {
//			addFieldError("opcion", "Debe seleccionar una opción de contacto");
//		}
		
		String correo = s.getCorreo().getCorreoElectronico();
		if(correo != null && !"".equals(correo.trim())){
			noHayErrores &= super.esCorreoValido(s.getCorreo().getCorreoElectronico(), "formularioOirs.solicitante.correo.correoElectronico");
		}

		if(!ValidaUtil.isValidRut(s.getRut(), s.getDv())){
			noHayErrores = false;
			addFieldError("formularioOirs.solicitante.rut", "El rut no es v\u00EDlido");
		}


		//Si hay errores volvemos al formulario de ingreso inmediatamente
		if(!noHayErrores){
			return INPUT;
		}

		boolean isNew = (formularioOirs.getId() == null);

		formularioOirs.setFechaIngreso(new Date(System.currentTimeMillis()));

		formularioOirs = formularioOirsManager.save(formularioOirs);

		String key = (isNew) ? "formularioOirs.added" : "formularioOirs.updated";
		saveMessage(getText(key));
		saveMessage("Siga sus solicitudes mediente la opci\u00F3n consultar solicitudes ingresando el siguiente c\u00F3digo ticket [" 
				+ formularioOirs.getSolicitante().getTicket() + "].");

		if (!isNew) {
			return INPUT;
		} else { 

			return SUCCESS;
		}
	}


	public String consultaSolicitudesList() {
		if(formularioOirs != null){
			Solicitante s = formularioOirs.getSolicitante();

			if(!ValidaUtil.isValidRut(s.getRut(), s.getDv())){
				addFieldError("formularioOirs.solicitante.rut", "El rut no es v\u00EDlido");
			}

			if(!hasFieldErrors()){ 
				formularioOirss = formularioOirsManager.getSolicitudesPorTicket(formularioOirs);
			}
		}

		return SUCCESS;
	}
}